﻿using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using Intellego.Web.ValidationEngine;
using MIAP.Entidades;
using MIAP.Entidades.Enums;
using MIAP.Negocio;
using MIAPWEB.Common;

namespace MIAPWEB.Forms
{
    public partial class AltaProyecto : PageBase
    {
        #region Variables
        /// <summary>
        /// Clase de negocio para proyectos
        /// </summary>
        private readonly AltaProyectosNegocio altaProyectosBussines;

        /// <summary>
        /// Clase de negocio para las operaciones comunes del sistema.
        /// </summary>
        private ComunesNegocio comunesNegocio;

        /// <summary>
        /// variable para consultarlos elementos acutales
        /// </summary>
        private ConfiguracionNegocio ConsultaConfiguracion;
        #endregion

        #region Propiedades



        /// <summary>
        /// Id del proyecto 
        /// </summary>
        private int? IdProyecto
        {
            get
            {
                if (this.ViewState[AppQueryStrings.IdProyecto] == null)
                {
                    this.ViewState[AppQueryStrings.IdProyecto] = this.Request.QueryString[AppQueryStrings.IdProyecto];
                }

                return Convert.ToInt32(this.ViewState[AppQueryStrings.IdProyecto]);
            }

            set
            {
                this.ViewState[AppQueryStrings.IdProyecto] = value;
            }
        }

        #endregion

        #region Eventos

        /// <summary>
        /// Evento que se ejecuta al cargar la página.
        /// </summary>
        /// <param name="sender">Obeto que invoca el evento.</param>
        /// <param name="e">Argumentos del evento.</param>
        protected void Page_Load(object sender, EventArgs e)
        {
            var aplicaTodasReglas = true;
            if (!IsPostBack)
            {
                if (Request.UrlReferrer != null) this.PreviousPage = Request.UrlReferrer.ToString();
                this.LoadinitialCatalogs();
                //this.AppendDefaultDropDownItem();
                if (this.IdProyecto != null && this.IdProyecto > 0)
                {
                    this.lblTitulo.Text = this.GetGlobalResourceObject("strings", "ModificarProyecto_Titulo").ToString();

                    this.LoadProyecto((int)this.IdProyecto);
                    //aplicaTodasReglas = false;
                }
                else
                {
                    this.lblTitulo.Text = this.GetGlobalResourceObject("strings", "AltaProyecto_Titulo").ToString();
                }
            }
            this.InitValidation(aplicaTodasReglas);
        }

        /// <summary>
        /// Carga la informacion del proyecto 
        /// </summary>
        /// <param name="idProyecto">Id del proyecto a editar</param>
        private void LoadProyecto(int idProyecto)
        {
            var proyecto = this.altaProyectosBussines.GetProyectoById(idProyecto);
            this.txtDescripcion.Text = proyecto.Descripcion;
            this.txtNombre.Text = proyecto.NombreProyecto;
            this.txtNombrePaquete.Text = proyecto.PaqueteCarga;
            this.ddlEstatus.SelectedValue = Convert.ToInt32(proyecto.Estatus.ToUpper() == "ACTIVO").ToString(CultureInfo.InvariantCulture);
            this.ddlPeriodoCarga.SelectedValue = proyecto.PeriodoCarga.IdentificadorPeriodo.ToString(CultureInfo.InvariantCulture);
            this.ddlPeriodoInformacion.SelectedValue = proyecto.PeriodoInformacion.IdentificadorPeriodo.ToString();
            var boletos = this.ConsultaConfiguracion.GetVariablesPaquete(proyecto.NombreProyecto,
                                                               string.Empty);
            this.wucVariablesDtsx.AddControls(boletos);
        }

        /// <summary>
        /// Limpia los controles de la página
        /// </summary>
        private void Clean()
        {
            this.wucVariablesDtsx.Clean();
            this.txtDescripcion.Text = string.Empty;
            this.txtNombre.Text = string.Empty;
            //this.FuPaquetes.Dispose();
            this.txtNombrePaquete.Text = string.Empty;
            this.ddlEstatus.SelectedIndex = -1;
            this.ddlPeriodoCarga.SelectedIndex = -1;
            this.ddlPeriodoInformacion.SelectedIndex = -1;
        }

        /// <summary>
        /// Agrega al inicio del drop down el item seleccionar
        /// </summary>
        private void AppendDefaultDropDownItem()
        {
            var mensajeSeleccioanr = this.GetGlobalResourceObject("strings", "Seleccionar").ToString();
            this.comunesNegocio.SetSeleccionar(mensajeSeleccioanr, this.ddlPeriodoCarga);
            this.comunesNegocio.SetSeleccionar(mensajeSeleccioanr, this.ddlPeriodoInformacion);
        }

        /// <summary>
        /// Llena los dropdowns de la página
        /// </summary>
        private void LoadinitialCatalogs()
        {
            this.ddlPeriodoCarga.DataSource = this.altaProyectosBussines.GetPeriodosCarga().ToList();
            this.ddlPeriodoCarga.DataBind();
            this.ddlPeriodoInformacion.DataSource = this.altaProyectosBussines.GetPeriodosInformacion().ToList();
            this.ddlPeriodoInformacion.DataBind();
            this.ddlEstatus.DataSource = this.comunesNegocio.GetEstatus();
            this.ddlEstatus.DataBind();
        }

        /// <summary>
        /// Evento del click en el boton de guardar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnGuardar_Click(object sender, EventArgs e)
        {
            // Valida que no exista un proyecto con el mismo nombre.
            if (this.IdProyecto == default(int) || this.IdProyecto == null)
            {
                string nombreProyecto = this.txtNombre.Text.Trim().ToLower();

                nombreProyecto = Regex.Replace(nombreProyecto, @"\s+", " ");

                // Verifica la existencia del proyecto.
                if (this.VerifyExistProyecto(nombreProyecto))
                {
                    this.ShowMessage(this.GetGlobalResourceObject("Strings", "AltaProyecto_ProyectoExistente").ToString());
                }
                else
                {
                    this.Save();
                }
            }
            else
            {
                this.Save();
            }
        }

        /// <summary>
        /// Evento del click en el boton de salor o regesar
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void BtnSalir_Click(object sender, EventArgs e)
        {
            Response.Redirect(this.PreviousPage);
        }

        #endregion

        #region Métodos

        /// <summary>
        /// Establece las validaciones de la página.
        /// </summary>
        private void InitValidation(bool aplicaTodas)
        {
            var errorNotEmpty = this.GetGlobalResourceObject("Strings", "ErrorRequerido").ToString();
            var errorDropDownNotEmpty = this.GetGlobalResourceObject("Strings", "ErrorDropDownRequerido").ToString();

            var ruleNombre = new ValidationRule(this.txtNombre);
            var ruleDescripcion = new ValidationRule(this.txtDescripcion);

            var rulePeriodoInformacion = new ValidationRule(this.ddlPeriodoInformacion);
            var rulePeriodoCarga = new ValidationRule(this.ddlPeriodoCarga);
            var ruleActivo = new ValidationRule(this.ddlEstatus);

            ruleNombre.NotEmpty(errorNotEmpty);
            ruleDescripcion.NotEmpty(errorNotEmpty);

            rulePeriodoInformacion.NotEmpty(errorDropDownNotEmpty);
            rulePeriodoCarga.NotEmpty(errorDropDownNotEmpty);
            ruleActivo.NotEmpty(errorDropDownNotEmpty);

            this.ValidationEngine.Add(ruleNombre);
            this.ValidationEngine.Add(ruleDescripcion);
            this.ValidationEngine.Add(rulePeriodoInformacion);
            this.ValidationEngine.Add(rulePeriodoCarga);
            this.ValidationEngine.Add(ruleActivo);

            if (!aplicaTodas) return;

            var rulePaquete = new ValidationRule(this.txtNombrePaquete);

            rulePaquete.NotEmpty(errorNotEmpty);
            // rulePaquete.Matches("(.dtsx)$", this.GetGlobalResourceObject("strings", "ErrorDtsxPermitido").ToString());

            this.ValidationEngine.Add(rulePaquete);
            //Agrega la opción para respetar la longitud máxima en las cajas de texto multilínea
            this.ValidationEngine.FixTextBoxMultiLine = true;
        }

        /// <summary>
        /// Constructor inicial
        /// </summary>
        public AltaProyecto()
        {
            this.altaProyectosBussines = new AltaProyectosNegocio();
            this.comunesNegocio = new ComunesNegocio();
            this.ConsultaConfiguracion = new ConfiguracionNegocio();
        }

        /// <summary>
        /// Guarda la información del proyecto
        /// </summary>
        private void Save()
        {

            var loProyecto = this.IdProyecto.HasValue && this.IdProyecto.Value > 0
                              ? this.altaProyectosBussines.GetProyectoById(this.IdProyecto.Value)
                              : new ProyectoInfo();
            var nombreProyAnterior = loProyecto.NombreProyecto;
            loProyecto.NombreProyecto = this.txtNombre.Text;
            loProyecto.Descripcion = this.txtDescripcion.Text;
            loProyecto.Estatus = ddlEstatus.SelectedItem.Text;

            loProyecto.PeriodoInformacion = new PeriodoInfo
               {
                   IdentificadorPeriodo = Convert.ToInt32(ddlPeriodoInformacion.SelectedItem.Value),
                   NombrePeriodo = ddlPeriodoInformacion.SelectedItem.Text,
                   TipoPeriodo = TipoPeriodo.Informacion
               };

            loProyecto.PeriodoCarga = new PeriodoInfo
                {
                    IdentificadorPeriodo = Convert.ToInt32(ddlPeriodoCarga.SelectedItem.Value),
                    NombrePeriodo = ddlPeriodoCarga.SelectedItem.Text,
                    TipoPeriodo = TipoPeriodo.Informacion
                };

            //if (this.FuPaquetes.HasFile)
            if (this.txtNombrePaquete.Text != string.Empty)
            {
                loProyecto.PaqueteCarga = this.txtNombrePaquete.Text; //this.FuPaquetes.FileName;
            }
            var valoresParametros = this.wucVariablesDtsx.GetValores();
            var mensajeGuardado = this.GetGlobalResourceObject("strings", "GuardadoExitoso").ToString();

            if (this.IdProyecto == null || this.IdProyecto == 0)
            {
                this.altaProyectosBussines.AddNewProyecto(loProyecto, AppSessionManager.Instance.Usuario);
                this.ConsultaConfiguracion.SetVariablesPaquete(this.txtNombre.Text, string.Empty
                 , AppSessionManager.Instance.Usuario, valoresParametros);
                this.ShowMessage(mensajeGuardado);
                AppSessionManager.Instance.RecalculaPermisos();
                this.Clean();
            }
            else
            {
                this.altaProyectosBussines.EditProyecto(loProyecto, AppSessionManager.Instance.Usuario);
                ConsultaConfiguracion.EditVariablesPaquete(nombreProyAnterior, this.txtNombre.Text, string.Empty, string.Empty
       , AppSessionManager.Instance.Usuario, valoresParametros);
                AppSessionManager.Instance.RecalculaPermisos();
                this.Clean();
                this.ShowMessage(mensajeGuardado, this.PreviousPage);
            }
        }

        /// <summary>
        /// Verifica la existencia del proyecto.
        /// </summary>
        /// <param name="nombreProyecto">Nombre del proyecto que se desea agregar.</param>
        /// <returns>Indicador de si el proyecto existe o no.</returns>
        public bool VerifyExistProyecto(string nombreProyecto)
        {
            return this.altaProyectosBussines.VerifyExistProyecto(nombreProyecto);
        }

        #endregion

        protected void lnkVariables_OnClick(object sender, EventArgs e)
        {
            VariablesModalPopupExtender.Show();
        }

        protected void CargarVariables_btnClick(object sender, EventArgs e)
        {

        }
    }
}